{ "cells": [ { "cell_type": "markdown", "id": "continuous-certificate", "metadata": {}, "source": [ "
\n",
" Si c'est votre première visite dans ce TP, lisez attentivement chacun des points détaillé après ce paragraphe.
\n",
" Si vous avez déjà commencer à travailler sur ce TP et que vous souhaiter vous déplacer rapidement dans une partie précise vous pouvez choisir la partie que vous souhaitez rejoindre ci-dessous. N'oubliez pas de réexecuter les case contenant des bibliothèques nécessaire au reste du code.
\n",
" Menu de navigation
\n",
" \n",
"
\n",
" math
\n",
" La technologie jupyter permet d'exécuter du code python par un simple clique sur Executer ci-dessus.
\n",
" Les morceaux de code de cette page sont interprétées case par case. Pour savoir quelle case a été interprétée avant une autre, il suffit de repérer le numéro devant la case.
\n",
" Une fois qu'une case a été interprétée (=exécutée), la page garde en mémoire les variables et fonctions lues
\n",
" La plateforme propose quelques outils de purge de la mémoire : \n",
"
\n",
" Pour ne pas perdre votre travail pensez à le sauvegarder régulièrement. Par défault, la sauvegarde par un clic sur la disquette en haut à gauche de page, ou par le racourci clavier classique ctrl+S
\n",
" est une sauvegarde en local, sur le serveur de jupyter. Vous pouvez et devez très régulièrement sauvegarder votre travail sur votre support personnel de sauvegarde (clef USB, se l'envoyer par mail etc). Ce faisant vous disposerez d'un fichier .ipynb (IPYthon NoteBook) qu'il vous suffira de recharger pour avancer. Après le rechargement assurez vous que les fonctionnalités anciennement developpées et variables utilisées sont bien dans la mémoire de la page (en rééxecutant les cases, ou plus rapidement par Kernel > Restart & Run All.
A NOTER : vous pouvez travailler sur le tp (et tout autre fichier .ipynb) hors connexion en installant une version local du notebook de jupyter. Il faut que votre machine possède un interpreteur de python et que vous soyez connecter à internet.\n", "
pip install jupyterlab
jupyter notebook
\n",
" Menu de navigation
\n",
" \n",
"
\n",
" math
Pour pouvoir réaliser des graphiques en python, nous avons besoin de spécifier des listes (de points). La fonction de base est la fonction range
qui permet très rapidement d'énumeré des entiers (et non des nombres décimaux). Voici les trois utilisations possibles : \n",
"
range(n)
qui donne la liste des entiers de 0
à n-1
. Par exemple range(10)
donnera [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
range(a, b)
qui donne la liste des entiers entre a
et b-1
. Par exemple range(3, 10)
donnera [3, 4, 5, 6, 7, 8, 9]
range(a, b, p)
qui donne la liste des entiers entre a
et b-1
par bond de p
. Par exemple range(3, 10, 3)
donnera [3, 6, 9]
range
est un type en python. Pour s'en convaincre utilisons la fonction type
qui renvoie le type d'une variable en python.\n",
""
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "reflected-sample",
"metadata": {},
"outputs": [],
"source": [
"#Le type 'int' pour les entiers\n",
"x=10\n",
"print(\"type de '10' :\", type(x))\n",
"\n",
"#Le type 'float' pour les réels\n",
"x=1.0\n",
"print(\"type de '1.0' :\", type(x))\n",
"\n",
"#Le type 'list' pour les listes\n",
"x=[10]\n",
"print(\"type de '[10]' :\", type(x))\n",
"\n",
"#Le type 'range' pour les listes organisées\n",
"x=range(10)\n",
"print(\"type de 'range(10)' :\", type(x))"
]
},
{
"cell_type": "markdown",
"id": "nuclear-affairs",
"metadata": {},
"source": [
"Pour passer d'un type à l'autre on réalise un cast. Pour cela on utilise les fonctions qui portent le nom des types.
" ] }, { "cell_type": "code", "execution_count": null, "id": "35105b30", "metadata": {}, "outputs": [], "source": [ "x=10\n", "print(\"x =\", x)\n", "print(\"type de 'x' :\", type(x))\n", "print(\"type de 'float(x)' :\", type(float(x)))\n", "\n", "x=1.0\n", "print(\"x =\", x)\n", "print(\"type de 'x' :\", type(x))\n", "print(\"type de 'int(x)' :\", type(int(x)))" ] }, { "cell_type": "markdown", "id": "11195a75", "metadata": {}, "source": [ "Il est possible de créer des listes de nombres pas forcément entiers de la manière suivante : \n", "
\n",
" y=[fonction de x for x in valeur]
\n",
"
\n",
"Dans ce cas la liste y
aura dans chacune de ses cases la valeur de f(x)
pour les différentes valeurs prises par x
. Par exemples si\n",
"\n",
"\n",
" y=y=[5*x-5 for x in range(-9, 10, 2)]
\n",
"
\n",
"alors \n",
"y=[-50, -40, -30, -20, -10, 0, 10, 20, 30, 40]
\n",
""
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "swedish-elite",
"metadata": {},
"outputs": [],
"source": [
"y=[5*x-5 for x in range(-9, 10, 2)]\n",
"print(y)"
]
},
{
"cell_type": "markdown",
"id": "muslim-drawing",
"metadata": {},
"source": [
"\n",
"Il est également possible de spécifier une condition à l'aide de if
. Par exemple\n",
"
\n",
" y=[5*x-5 for x in range(-9, 10, 2) if(5*x-5!=0)]
\n",
"
\n",
"affichera la même liste que précédement sauf $0$\n",
""
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "found-float",
"metadata": {},
"outputs": [],
"source": [
"y=[5*x-5 for x in range(-9, 10, 2) if(5*x-5!=0)]\n",
"print(y)"
]
},
{
"cell_type": "markdown",
"id": "resident-possession",
"metadata": {},
"source": [
"math
\n",
"\n",
" Menu de navigation
\n",
" \n",
"
\n",
" math
Comme n'importe quelle calculatrice, nous souhaitons pouvoir utiliser des fonctions comme le cosinus, la racine carrée, le logarithme etc. Pour pouvoir utiliser ces fonctionnalités dites avancées il faut les charger dans le programme. Autrement dit : pour calculer la racine carrée de $2$, il faut écrire un programme de calcul de la racine carrée. Fort heureusement d'autres s'en sont déjà occupé ! Le fait de charger cette fonction revient à aller chercher le code d'autre programmeur et de simplement l'utiliser. Toutes les fonctions mathématiques dont nous pourrions avoir besoin sont rangées dans une bibliothèque : math
(original).
\n", "Voici le fonctions que nous pouvons y trouver.\n", "
Mathématiques | \n", "Python | \n", "
---|---|
$|x|$ | \n", "abs(x) | \n",
"
$\\sqrt{x}$ | \n", "sqrt(x) | \n",
"
$e^x$ | \n", "exp(x) | \n",
"
$ln(x)$ | \n", "log(x) | \n",
"
$log(x)$ | \n", "log10(x) | \n",
"
$cos(x)$ | \n", "cos(x) | \n",
"
$sin(x)$ | \n", "sin(x) | \n",
"
$tan(x)$ | \n", "tan(x) | \n",
"
$\\pi$ | \n", "pi | \n",
"
$e(=e^1)$ | \n", "e | \n",
"
$x^y$ | \n", "pow(x, y) | \n",
"
$n!$ | \n", "factorial(n) | \n",
"
\n",
" import math
\n",
"
\n",
" qui s'utilise en appelant les fonctions précédées du nom de la bibliothèque x=math.cos(0)+math.exp(1)
.\n",
" \n",
" from math import cos as trigoDifficile, sin as trigoDifficile2, exp as UneFonctionDeTerminale
\n",
"
\n",
" et qui s'utilise comme d'habitude mais avec leur nouveau nom comme par exemple x=trigoDificille(0)+UneFonctionDeTerminale(1)
.\n",
" \n",
" from math import cos, sin, exp
\n",
"
\n",
" et qui s'utilise comme d'habitude comme par exemple x=cos(0)+exp(1)
.\n",
" \n",
" from math import *
\n",
"
\n",
" et qui s'utilise comme dans le cas précédent.\n",
" \n", "Si l'on souhaite afficher la liste des carrés des nombres réels entre $0$ et $1$ de $0.1$ en $0.1$ voici comment on peut procéder : \n", "
[x for x in range(11)]
.[x/10 for x in range(11)]
.[(x/10)**2 for x in range(11)]
.\n",
" Autre exemple : on souhaite calculer le logarithme népérien (log
) de $x^2+x-6$ pour $101$ valeurs équi-répartie dans l'intervalle $[-3 ; 3]$.\n",
"
range(101)
.x
une valeur de cette liste, si on réalise l'opération x/100
alors le nombre sera entre $0$ et $1$. Puisqu'on souhaite être entre $-3$ et $3$, il faut translater et dilater cette intervalle. Vite des maths : \n",
" -3+(3-(-3))*x/100
soit plus simplement -3+6*x/100
.\n",
" \n",
" A=[-3+6*x/100 for x in range(101)]
\n",
"
\n",
"\n",
" B=[x**2+x-6 for x in A if(x**2+x-6>0)]
\n",
"
\n",
"\n",
" C=[log(x) for x in B]
\n",
"
\n",
""
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "5ad7b969",
"metadata": {},
"outputs": [],
"source": [
"A=[-3+6*x/100 for x in range(101)]\n",
"B=[x**2+x-6 for x in A if(x**2+x-6>0)]\n",
"C=[log(x) for x in B]\n",
"print(C)"
]
},
{
"cell_type": "markdown",
"id": "confirmed-arthritis",
"metadata": {},
"source": [
"On peut bien sur simplifier cette rédaction
" ] }, { "cell_type": "code", "execution_count": null, "id": "ranking-vaccine", "metadata": {}, "outputs": [], "source": [ "D=[log((-3+6*x/100)**2+(-3+6*x/100)-6) for x in range(101) if (((-3+6*x/100)**2+(-3+6*x/100)-6)>0)]\n", "print(D)" ] }, { "cell_type": "markdown", "id": "simple-soviet", "metadata": {}, "source": [ "\n",
" Menu de navigation
\n",
" \n",
"
\n",
" math
Comme pour les fonctions, il faut définir la fenêtre de graphique. Par chance, d'autres s'en sont occupés. Chargeons cette fonctionnalité : exécuter la case suivante.
" ] }, { "cell_type": "code", "execution_count": null, "id": "foster-nirvana", "metadata": {}, "outputs": [], "source": [ "from matplotlib.pyplot import *" ] }, { "cell_type": "markdown", "id": "adverse-civilization", "metadata": {}, "source": [ "Pour faire un graphique rien de plus simple ! On utilise la fonction plot
qui prend au moins deux paramètres : \n",
"
La fonction plot
crée un objet fenêtre graphique il faut demander à afficher cette fenêtre (NB: jupyter est très gentil, lorsqu'on ne lui indique pas d'afficher le graphique, il le fait tout seul. Pour s'en convaincre, remarquer le Out
dans la marge de gauche).
\n",
"Pour afficher la fenêtre graphique, on utilise la fonction show
\n",
"
grid(True)
permet d'afficher une grille dans le graphique. Exemple : \n",
" plot(X, Y)
grid(True)
\n",
" plot
, comme dans l'exemple suivant : \n",
" plot(X, Y, 'k')
\n",
" Les différentes couleurs prédéfinies sont : \n",
" Couleur | \n", "Code | \n", "
---|---|
Bleu | \n", "'b' | \n",
"
Vert | \n", "'g' | \n",
"
Rouge | \n", "'r' | \n",
"
Cyan | \n", "'c' | \n",
"
Magenta | \n", "'m' | \n",
"
Jaune | \n", "'y' | \n",
"
Noir | \n", "'k' | \n",
"
Blanc | \n", "'w' | \n",
"
Style | \n", "Code | \n", "
---|---|
Ligne continue (par défaut) | \n", "'-' | \n",
"
Tiret | \n", "'--' | \n",
"
Pointillé | \n", "':' | \n",
"
plot(X, Y, ':')
\n",
" ATTENTION cependant ! Si vous voulez modifier la couleur et le style du trait, il faut le faire en même temps. De sorte que plot(X, Y, ':', 'r')
est une erreur. On corrigera par\n",
" plot(X, Y, 'r:')
\n",
" plot(X, Y)
place par défaut des points (ceux de X
et Y
) et les relie par des traits (où d'autre style comme nous l'avons vu précédement). On peut changer le style des marques parmi ceux de la liste suivante : \n",
" Marqueur | \n", "Code | \n", "
---|---|
Point (par défaut) | \n", "'.' | \n",
"
Cercle | \n", "'o' | \n",
"
Triangle vers le bas | \n", "'v' | \n",
"
Triangle vers le haut | \n", "'^' | \n",
"
Triangle vers la gauche | \n", "'<' | \n",
"
Triangle vers la droite | \n", "'>' | \n",
"
Carré | \n", "'s' | \n",
"
Pentagone | \n", "'p' | \n",
"
Etoile | \n", "'*' | \n",
"
Plus | \n", "'+' | \n",
"
Croix | \n", "'x' | \n",
"
Losange | \n", "'d' | \n",
"
plot(X, Y, 'rd:')
\n",
" plot
la paramètre linewidth
.\n",
" plot(X, Y, linewidth=5)
\n",
" xlim
et ylim
qui prennent chacun deux paramètres : la plus grande et la plus petite valeur sur les axes respectifs.\n",
" plot(X, Y)
xlim(-1,1)
ylim(-10, 10)
\n",
" title
\n",
" plot(X, Y)
title(\"Graphique de ma fonction\")
\n",
" plot
différent). Dans ce cas, pour les disctinguer (en plus des couleurs), on peut légender les différentes courbes. Il y a pour cela deux choses à faire : \n",
" label
dans plot
.label
. Pour cela on appel la fonction legend
sans paramètre.plot(X, Y, label=\"Fonction 1\")
plot(X, Z, label=\"Fonction 2\")
legend()
\n",
" xlabel
pour les abscisses et ylabel
pour les ordonnées.\n",
" plot(X, Y)
xlabel(\"Abscisses\")
ylabel(\"Ordonnées\")
\n",
" Voici un exemple qui résume tout.
" ] }, { "cell_type": "code", "execution_count": null, "id": "radical-composition", "metadata": {}, "outputs": [], "source": [ "#Coordonnes des points\n", "X=[x/10 for x in range(10+1)]\n", "Y=[sqrt(x) for x in X]\n", "Z=[x**2 for x in X]\n", "\n", "#Dessin\n", "plot(X, Y, 'cx-', linewidth=1.5, label=\"$x\\mapsto \\sqrt{x}$\")\n", "plot(X, Z, 'm^--', label=\"$x\\mapsto x^2$\")\n", "plot(X, X, 'r*:', label=\"$x\\mapsto x$\")\n", "\n", "#Dimension de la fenêtre\n", "xlim(0, 1)\n", "ylim(0, 1)\n", "\n", "#Titre et légende\n", "title(\"Comparaison entre $x^2$ et $\\sqrt{x}$ sur $[0; 1]$\")\n", "xlabel(\"Abscisses\")\n", "ylabel(\"Ordonnées\")\n", "legend()\n", "\n", "#Quadrillage\n", "grid(True)\n", "\n", "#Affichage\n", "show()" ] }, { "cell_type": "markdown", "id": "international-paris", "metadata": {}, "source": [ "Les possibilités sont très nombreuses. Pour explorer les possibilités de graphique en python à l'aide de matplotlib
, on pourra consulter la documentation ici : https://matplotlib.org/.
Pour réaliser un nuage de point on utilise la fonction scatter
.
On pourra en apprendre plus sur cette fonction ici
" ] }, { "cell_type": "markdown", "id": "dirty-agreement", "metadata": {}, "source": [ "
La fonction plot
utilise des données cartésinnes, c'est à dire des $x$ et $y$ classiques. il existe une autre manière de représenter les points du plan : les coodonnées polaires. Dans ce cas on précise la distance à l'origine et l'angle (en radian) formé avec l'axe des demi-abscisses positif. La fonction polar
réalise alors un grpahique circulaire.
La fonction bar
permet de réaliser des diagrammes en batôn.
On pourra en apprendre plus sur la fonction bar
par ici
Pour dimensionner une figure, il suffit d'utiliser figure(figsize=(hauteur, largeur))
.
Il est possible de réaliser plusieurs graphique à l'aide de la fonction subplot
qui prend en paramètre le nombre de ligne, le nombre de colonne et le numéro du graphique considéré.